/**
 * 研发资源管理业务逻辑
 */
const ResearchStateBiz = require('./research_state_biz.js');
// 直接引用相关模块
const ProjectHelpers = require('../../config/project_helpers_config');
const pageHelper = ProjectHelpers.pageHelper;
const cloudHelper = ProjectHelpers.cloudHelper;
const testHelper = ProjectHelpers.testHelper || require('../../helpers/test_helper');

/**
 * 资源类型定义
 */
const RESOURCE_TYPES = {
  DOC: 'doc',      // 文档
  PCB: 'pcb',      // PCB
  BOM: 'bom',      // BOM清单
  SOFTWARE: 'software', // 软件
  IMAGE: 'image',  // 图片
};

/**
 * 检查是否有资源上传权限
 * @param {Object} project 项目信息
 * @param {Object} user 用户信息
 * @returns {Object} 包含是否有权限以及原因
 */
function hasResourceUploadPermission(project, user) {
  // 测试模式下，直接返回有权限
  if (testHelper.isDebugModeEnabled && testHelper.isDebugModeEnabled()) {
    const currentRole = testHelper.getCurrentRole && testHelper.getCurrentRole();
    // 研发经理、管理员、硬件工程师和软件工程师有上传权限
    if (testHelper.hasAnyRole && testHelper.hasAnyRole(['admin', 'research_manager', 'hardware_engineer', 'software_engineer'])) {
      return {
        hasPermission: true,
        reason: '测试模式：允许上传资源'
      };
    }
  }

  // 默认没有权限
  const result = {
    hasPermission: false,
    reason: '无权上传资源'
  };

  if (!project || !user) {
    result.reason = '项目或用户信息不完整';
    return result;
  }

  // 1. 基于项目状态的控制
  const projectStatus = project.PROJECT_STATUS || 0;
  
  // 在待立项(0)和已完成(99)状态下禁止上传资源
  if (projectStatus === ResearchStateBiz.PROJECT_STATUS.PENDING) {
    result.reason = '待立项状态下不能上传资源';
    return result;
  }
  
  if (projectStatus === ResearchStateBiz.PROJECT_STATUS.COMPLETED) {
    result.reason = '项目已完成，不能上传资源';
    return result;
  }

  // 2. 基于用户角色的控制
  const isAdmin = user.IS_ADMIN; // 直接从用户信息判断是否管理员
  const isProjectOwner = user._id === project.USER_ID;
  const isProjectMember = project.PROJECT_MEMBERS && project.PROJECT_MEMBERS.includes(user._id);
  
  // 管理员、项目创建者和项目成员可以上传资源
  if (isAdmin || isProjectOwner || isProjectMember) {
    result.hasPermission = true;
    result.reason = '';
    return result;
  }

  result.reason = '您不是项目成员，无法上传资源';
  return result;
}

/**
 * 获取允许上传的资源类型
 * @param {Number} projectStatus 项目状态
 * @returns {Array} 允许上传的资源类型列表
 */
function getAllowedResourceTypes(projectStatus) {
  // 默认允许所有类型
  const allTypes = [
    RESOURCE_TYPES.DOC,
    RESOURCE_TYPES.PCB,
    RESOURCE_TYPES.BOM,
    RESOURCE_TYPES.SOFTWARE,
    RESOURCE_TYPES.IMAGE
  ];
  
  // 根据项目状态限制资源类型
  switch (projectStatus) {
    case ResearchStateBiz.PROJECT_STATUS.ACTIVE_HARDWARE_CONFIRM:
    case ResearchStateBiz.PROJECT_STATUS.ACTIVE_HARDWARE_DESIGN:
      // 硬件确认和设计阶段允许上传PCB和BOM
      return [RESOURCE_TYPES.DOC, RESOURCE_TYPES.PCB, RESOURCE_TYPES.BOM];
      
    case ResearchStateBiz.PROJECT_STATUS.ACTIVE_SW_HW_DEBUG:
      // 软硬件调试阶段允许上传软件和文档
      return [RESOURCE_TYPES.DOC, RESOURCE_TYPES.SOFTWARE];
      
    case ResearchStateBiz.PROJECT_STATUS.ACTIVE_TESTING:
      // 测试阶段允许上传文档和软件
      return [RESOURCE_TYPES.DOC, RESOURCE_TYPES.SOFTWARE];
      
    default:
      // 其他状态允许所有类型
      return allTypes;
  }
}

/**
 * 获取资源管理配置
 * @returns {Object} 资源管理配置信息
 */
function getResourceConfig() {
  return {
    // 单个资源大小限制 (单位: MB)
    maxSize: {
      [RESOURCE_TYPES.DOC]: 10,       // 10MB
      [RESOURCE_TYPES.PCB]: 2,        // 2MB
      [RESOURCE_TYPES.BOM]: 0.1,      // 100KB
      [RESOURCE_TYPES.SOFTWARE]: 10,  // 10MB
      [RESOURCE_TYPES.IMAGE]: 2       // 2MB
    },
    
    // 允许的文件格式
    allowedFormats: {
      [RESOURCE_TYPES.DOC]: ['.doc', '.docx', '.pdf', '.xls', '.xlsx', '.ppt', '.pptx', '.txt'],
      [RESOURCE_TYPES.PCB]: ['.pcb', '.sch', '.brd', '.dsn', '.zip', '.rar'],
      [RESOURCE_TYPES.BOM]: ['.xls', '.xlsx', '.csv'],
      [RESOURCE_TYPES.SOFTWARE]: ['.c', '.cpp', '.h', '.js', '.py', '.java', '.hex', '.bin', '.zip', '.rar'],
      [RESOURCE_TYPES.IMAGE]: ['.jpg', '.jpeg', '.png', '.gif', '.bmp']
    }
  };
}

/**
 * 获取资源引用关系
 * @param {String} resourceId 资源ID
 * @returns {Promise<Array>} 引用该资源的项目列表
 */
async function getResourceReferences(resourceId) {
  if (!resourceId) return [];
  
  try {
    const result = await cloudHelper.callCloudData('project_resource/references', {
      resourceId
    });
    
    return result.list || [];
  } catch (err) {
    console.error('获取资源引用关系失败', err);
    return [];
  }
}

/**
 * 获取资源版本信息
 * @param {String} resourceId 资源ID
 * @returns {Promise<Array>} 资源的所有版本信息
 */
async function getResourceVersions(resourceId) {
  if (!resourceId) return [];
  
  try {
    const result = await cloudHelper.callCloudData('project_resource/versions', {
      resourceId
    });
    
    return result.list || [];
  } catch (err) {
    console.error('获取资源版本信息失败', err);
    return [];
  }
}

/**
 * 比较两个资源版本的差异
 * @param {String} resourceId 资源ID
 * @param {String} versionA 版本A的标识
 * @param {String} versionB 版本B的标识
 * @returns {Promise<Object>} 版本差异信息
 */
async function compareResourceVersions(resourceId, versionA, versionB) {
  if (!resourceId || !versionA || !versionB) {
    return { status: 'error', message: '参数不完整' };
  }
  
  try {
    return await cloudHelper.callCloudData('project_resource/compare', {
      resourceId,
      versionA,
      versionB
    });
  } catch (err) {
    console.error('比较资源版本差异失败', err);
    return { 
      status: 'error', 
      message: '比较失败: ' + (err.message || '未知错误')
    };
  }
}

module.exports = {
  RESOURCE_TYPES,
  hasResourceUploadPermission,
  getAllowedResourceTypes,
  getResourceConfig,
  getResourceReferences,
  getResourceVersions,
  compareResourceVersions
}; 